昨天實作 SARSA 演算法,今天要實作 off-policy 的 TD Learning 方法:Q-Learning。由於內容大致上相同,因此今天會著重在與 SARSA 不同之處。
今天要實作的 Q-Learning,一樣分為五個函數處理,分別為
其中只有 SimProc 與 ValueUpdata 的部分與 SARSA 不同,因此以下針對這兩個函數進行說明。一樣可以在 GitHub 查看完整內容。
def SimProc(action_value, reward, trans_mat, steps, gamma, alpha, epsilon):
    # initialize setting
    record = []
    state = np.random.randint(1,15)
    for step in range(steps):
        # get next infromation
        action = GetAction(action_value, epsilon, state)
        next_state = np.argmax(trans_mat[:,state,action])
        record.append([state, action, reward[next_state], next_state])
        # update action value
        action_value[state, action] = ValueUpdate(action_value, record[step], alpha, gamma)
        # update for next step
        state = next_state
        if state == 0 or state == 15:
            break
    return action_value
與 SARSA 方法不同之處主要在於
因此我們在實作上,沒有 next_action 這個變數,在 record 中也不需記錄這個參數。
def ValueUpdate(action_value, record, alpha, gamma):
    state = record[0]
    action = record[1]
    reward = record[2]
    next_state = record[3]
    now_value = action_value[state, action]
    update_value = alpha*(reward + gamma*np.max(action_value[next_state,:]) - now_value)
    value = now_value + update_value
    return value
與 SARSA 方法不同之處主要在於
因此在實作上,主要的差異在於 update_value 這個變數,我們改採用 action_value 的最大值估計下一狀態的動作價值。
============================================================
[Greedy Policy]
Episode: 1000
[['*' '<' '<' '<']
 ['^' '^' 'v' 'v']
 ['^' '^' '>' 'v']
 ['>' '>' '>' '*']]
============================================================
看起來的結果與 SARSA 有差異,但我們不能保證是不是模擬過程造成的差異。
從 GridWorld 的例子中,我們看不太出這兩個演算法的差別。從數學上來看,可以推測 Q-Learning 產出的動作價值會高於 SARSA,畢竟 Q-Learning 每一次都使用最大價值更新,不過在 GridWorld 中並沒有發現特別的差異:
[SARSA - max action value]
[[ 0.          0.         -0.99919909 -1.79209217]
 [ 0.         -0.93548848 -1.42440894 -0.99739422]
 [-0.99711271 -1.40733501 -0.94895313  0.        ]
 [-1.74605935 -0.99796185  0.          0.        ]]
[Q-Learning - max action value]
[[ 0.          0.         -0.99680078 -1.73150158]
 [ 0.         -0.95623369 -1.52771181 -0.99645516]
 [-0.99835771 -1.44740146 -0.95842201  0.        ]
 [-1.68129873 -0.99827127  0.          0.        ]]
這是 Day 24 與 Day 25 的策略下,對應的動作價值。
在書上提了一個稱為 cliff-walking 的例子,說明了 SARSA 是一個比較保守的方法。明天將會介紹這個例子、應用 SARSA 與 Q-Learning 於該問題、並比較兩者的結果。